# 在内置数据类型（dict、list、set、tuple）的基础上，
# collections模块还提供了几个额外的数据类型：Counter、deque、defaultdict、namedtuple和OrderedDict等

# 1.namedtuple: 生成可以使用名字来访问元素内容的tuple
# 看到(1, 2)，很难看出这个tuple是用来表示一个坐标的。
# 这时，namedtuple就派上了用场：
# from collections import namedtuple
# Point = namedtuple('Point', ['x', 'y'])
# p = Point(1, 2)
# print(p.x)


# 2.deque: 双端队列，可以快速的从另外一侧追加和推出对象
# from collections import deque
# q = deque(['a','b','c'])
# q.append('x')
# q.appendleft('y')
# print(q)

# 3.Counter: 计数器，主要用来计数
from collections import Counter
# c = Counter('fsadfasdfasd') #统计该字符串各字母出现的次数
# print(c)
# c1 = Counter({'red': 4, 'yello': 2})
# print(c1)
# c2 = Counter(cats=2, dogs=5)
# print(c2)

# c = Counter(a=4, b=3, c=0, d=2,e=-1)
# d = Counter(a=5, b=2, c=3, d1=4,e=-2)
# print(c+d) # counter相加, 相同的key的value相加,以加号后面的key为基准
# print(c-d) #counter相减, 相同的key的value相减，只保留正值得value，以减号前面的key为基准
# print(c & d)  # 交集:  取两者都有的key,value取小的那一个,只保留大于0的值
# print(c|d)  # 并集:  汇聚所有的key, key相同的情况下，取大的value，只保留大于0的值
# c.subtract(d)
# print(c)
# print(list(c))
# print(set(c))
# print(dict(c))
# print(sum(c.values()))
# c.clear()
# print(c.items()) #转化成(元素，计数值)组成的列表

# 4.OrderedDict: 有序字典
import collections
#
# d={}
# d['a']='A'
# d['b']='B'
# d['c']='C'
#
# for i in range(10):
#  for k,v in d.items():
#     print(k,v)
#
# #有序字典可以按字典中元素的插入顺序来输出。
# d1=collections.OrderedDict()
# d1['a']='A'
# d1['b']='B'
# d1['c']='C'

# for k,v in d1.items():
#     print(k,v)

# 5.defaultdict: 带有默认值的字典
#带有默认值的字典,不存在也不会报错
from collections import defaultdict

dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)
dict1[2] ='two'
print(dict1[1])
print(dict2[1])
print(dict3[1])
print(dict4[1])

